package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.PermissionDao;
import com.itheima.dao.RoleDao;
import com.itheima.entity.PageResult;
import com.itheima.pojo.Menu;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 角色实现类
 */
@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private PermissionDao permissionDao;

    /**
     * 分页查询
     * @return
     */
    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //第一步：设置分页参数
        PageHelper.startPage(currentPage, pageSize);
        //第二步：查询数据库（代码一定要紧跟设置分页代码  没有手动分页 select * from table where name = 'xx'  ）
        Page<Role> roleDaoPage = roleDao.findPage(queryString);
        return new PageResult(roleDaoPage.getTotal(), roleDaoPage.getResult());
    }

    /**
     * 新增角色
     */
    @Override
    public void add(Role role) {
        //查询角色表中所有数据
        List<Role> roleList = roleDao.findAll();
        String roleName = role.getName();
        String roleKeyword = role.getKeyword();
        //对表中数据和添加数据中的name和keyword是否有相同
        if (roleList != null && roleList.size() > 0) {
            for (Role role1 : roleList) {
                String name = role1.getName();
                String keyword = role1.getKeyword();
                if (name.equals(roleName) || keyword.equals(roleKeyword)) {
                    throw new RuntimeException("添加失败,检查角色名称或者关键字是否有在表中是否有重复");
                }
            }
        }
        //往数据库添加数据
        roleDao.add(role);
    }

    /**
     * 查询角色
     * @param roleId
     */
    @Override
    public Role findById(Integer roleId) {
        return roleDao.findById(roleId);
    }

    /**
     * 修改角色
     * @param role
     */
    @Override
    public void edit(Role role) {
        //查询角色表中所有数据
        List<Role> roleList = roleDao.findAll();
        String roleName = role.getName();
        String roleKeyword = role.getKeyword();
        Integer roleId = role.getId();
        //对表中数据和添加数据中的name和keyword是否有相同
        if (roleList != null && roleList.size() > 0) {
            for (Role role1 : roleList) {
                String name = role1.getName();
                String keyword = role1.getKeyword();
                Integer role1Id = role1.getId();
                if (name.equals(roleName) || keyword.equals(roleKeyword)) {
                    if (!roleId.equals(role1Id)){
                        throw new RuntimeException("修改失败,检查角色名称或者关键字是否有在表中是否有重复");
                    }
                }
            }
        }
        roleDao.edit(role);
    }

    /**
     * 根据角色id 查询菜单id
     */
    @Override
    public List<Integer> findRoleMenuIdsByRoleId(Integer roleId) {
        return roleDao.findRoleMenuIdsByRoleId(roleId);
    }

    /**
     * 根据角色id 查询权限id
     */
    @Override
    public List<Integer> findRolepermissionIdsByRoleId(Integer roleId) {
        return roleDao.findRolepermissionIdsByRoleId(roleId);
    }

    /**
     * 查询所有权限
     * @return
     */
    @Override
    public List<Permission> queryAllPermissions() {
        return permissionDao.queryAllPermissions();
    }

    /**
     * 查询所有菜单
     */
    @Override
    public List<Menu> findAllMenu() {
        return roleDao.findAllMenu();
    }

    /**
     * 根据角色id修改角色和菜单表的关联
     */
    @Override
    public void menupermissionedit(Integer roleId, Integer[] menu, Integer[] permission) {
        //根据角色id删除角色表和菜单表中间的数据
        roleDao.deleteRoleMenuById(roleId);
        //根据角色id删除角色表和权限表中间的数据
        roleDao.deleteRolePermission(roleId);
        //根据页面传入的角色id 和 菜单表重新建立关系
        if (menu != null && menu.length > 0) {
            for (Integer integer : menu) {
                Map<String, Object> map = new HashMap<>();
                map.put("integer", integer);
                map.put("roleId", roleId);
                roleDao.setCheckGroupAndCheckItem(map);
            }
        }
        //根据页面传入的角色id 和 权限表重新建立关系
        if (permission != null && permission.length > 0) {
            for (Integer integer : permission) {
                Map<String, Object> map = new HashMap<>();
                map.put("integer", integer);
                map.put("roleId", roleId);
                roleDao.setRolePermission(map);
            }
        }
    }

    /**
     * 根据角色id，删除角色
     */
    @Override
    public void deleteById(Integer roleId) {
        int count = roleDao.getRoleMenu(roleId);
        if (count > 0) {
            throw new RuntimeException("角色表和菜单表有关联，无法删除");
        }
        count = roleDao.getRolePerMission(roleId);
        if (count > 0) {
            throw new RuntimeException("角色表和权限表有关联，无法删除");
        }
        count = roleDao.getUserRole(roleId);
        if (count > 0) {
            throw new RuntimeException("角色表和用户表有关联，无法删除");
        }
        roleDao.deleteById(roleId);
    }
}
